Return to start page

Systems/Character/Struct Pvp.j

Code

		
1			library AStructSystemsCharacterPvp requires AStructCoreGeneralHashTable, AStructCoreGeneralVector, ALibraryCoreStringConversion
2
3 function interface APvpOnEnterAction takes APvp pvp, unit usedUnit returns nothing
4
5 function interface APvpOnLeaveAction takes APvp pvp, unit usedUnit returns nothing
6
7 function interface APvpOnScoreAction takes APvp pvp, unit scoringUnit, unit dyingUnit, integer newScores returns nothing
8
9 /// @todo Finish this struct. Strings should be constant values, add init method, add config options for scoring.
10 struct APvp
11 //static start members
12 private static boolean m_useLeaderboard
13 //dynamic members
14 private ARealVector m_startX
15 private ARealVector m_startY
16 private ARealVector m_startFacing
17 //members
18 private AUnitVector m_units
19 private AIntegerVector m_unitScores
20 private leaderboard m_leaderboard
21 private trigger m_killTrigger
22
23 public method unitEnters takes unit usedUnit returns integer
24 local player owner
25 if (this.m_units.size() == this.m_startX.size()) then
26 return -1
27 endif
28 call this.m_units.pushBack(usedUnit)
29 call SetUnitX(usedUnit, this.m_startX[this.m_units.backIndex()])
30 call SetUnitY(usedUnit, this.m_startY[this.m_units.backIndex()])
31 call SetUnitFacing(usedUnit, this.m_startFacing[this.m_units.backIndex()])
32 set owner = GetOwningPlayer(usedUnit)
33 call LeaderboardAddItem(this.m_leaderboard, GetUnitName(usedUnit), 0, owner)
34 set owner = null
35 call this.showMessage(StringArg(tr("%s hat die Arena betreten."), GetUnitName(usedUnit)))
36 return this.m_units.backIndex()
37 endmethod
38
39 public method unitLeaves takes unit usedUnit returns nothing
40 local integer index = this.m_units.find(usedUnit)
41 call this.m_units.erase(index)
42 call LeaderboardRemoveItem(this.m_leaderboard, index)
43 call this.showMessage(StringArg(tr("%s hat die Arena verlassen."), GetUnitName(usedUnit)))
44 endmethod
45
46 /// Unnecessary since @method unitLeaves uses index, too.
47 public method unitLeavesByIndex takes integer index returns nothing
48 endmethod
49
50 public method pause takes boolean pause returns nothing
51 local integer i = 0
52 loop
53 exitwhen (i == this.m_units.size())
54 call PauseUnit(this.m_units[i], pause)
55 call SetUnitInvulnerable(this.m_units[i], pause)
56 set i = i + 1
57 endloop
58 endmethod
59
60 /// @todo Use of player vector would be much easier.
61 public method showMessage takes string message returns nothing
62 local integer i = 0
63 local integer j
64 local player array owners
65 local integer ownerSize
66 local player owner
67 loop
68 exitwhen (i == this.m_units.size())
69 set owner = GetOwningPlayer(this.m_units[i])
70 set j = 0
71 loop
72 exitwhen (j == ownerSize or owners[j] == owner)
73 set j = j + 1
74 endloop
75 if (j == ownerSize) then
76 set owners[ownerSize] = owner
77 set ownerSize = ownerSize + 1
78 endif
79 set owner = null
80 set i = i + 1
81 endloop
82 set i = 0
83 loop
84 exitwhen (i == ownerSize)
85 call DisplayTimedTextToPlayer(owners[i], 0.0, 0.0, 6.0, message)
86 set owners[i] = null
87 set i = i + 1
88 endloop
89 endmethod
90
91 private static method triggerActionKill takes nothing returns nothing
92 local trigger triggeringTrigger = GetTriggeringTrigger()
93 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
94 local unit killedUnit
95 local unit killingUnit = GetKillingUnit()
96 local integer killerIndex = this.m_units.find(killingUnit)
97 if (killerIndex != -1) then
98 set killedUnit = GetTriggerUnit()
99 if (this.m_units.contains(killedUnit)) then
100 set this.m_unitScores[killerIndex] = this.m_unitScores[killerIndex] + 1
101 call LeaderboardSetItemValue(this.m_leaderboard, killerIndex, this.m_unitScores[killerIndex])
102 call LeaderboardSortItemsByValue(this.m_leaderboard, true)
103 call this.showMessage(StringArg(StringArg(tr("%s hat %s getötet."), GetUnitName(killingUnit)), GetUnitName(killedUnit)))
104 endif
105 set killedUnit = null
106 endif
107 set killingUnit = null
108 set triggeringTrigger = null
109 endmethod
110
111 private method createKillTrigger takes nothing returns nothing
112 local triggeraction triggerAction
113 set this.m_killTrigger = CreateTrigger()
114 call TriggerRegisterAnyUnitEventBJ(this.m_killTrigger, EVENT_PLAYER_UNIT_DEATH)
115 set triggerAction = TriggerAddAction(this.m_killTrigger, function thistype.triggerActionKill)
116 call AHashTable.global().setHandleInteger(this.m_killTrigger, "this", this)
117 set triggerAction = null
118 endmethod
119
120 public static method create takes nothing returns thistype
121 local thistype this = thistype.allocate()
122 //members
123 set this.m_units = AUnitVector.create()
124 set this.m_unitScores = AIntegerVector.create()
125 set this.m_leaderboard = CreateLeaderboard()
126 call this.createKillTrigger()
127
128 return this
129 endmethod
130
131 public method onDestroy takes nothing returns nothing
132 //members
133 call this.m_units.destroy()
134 call this.m_unitScores.destroy()
135 call DestroyLeaderboard(this.m_leaderboard)
136 set this.m_leaderboard = null
137 call AHashTable.global().destroyTrigger(this.m_killTrigger)
138 set this.m_killTrigger = null
139 endmethod
140 endstruct
141
142 endlibrary